class Solution {
public:
    int minFlips(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size(), ret1 = 0, ret2 = 0;
        // 双指针，遍历行 + 遍历列，取二者最少次数返回
        for(auto &row : grid)
            for(int j = 0; j < n / 2; j++)
                ret1 += row[j] != row[n - 1 - j]; 

        for(int j = 0; j < n; j++)
            for(int i = 0; i < m / 2; i++)
                ret2 += grid[i][j] != grid[m - 1 - i][j];


        // for(int i = 0; i < m; i++)
        // {
        //     int left = 0, right = n - 1;
        //     while(left < right)
        //     {
        //         if(grid[i][left] != grid[i][right])
        //             ret1++;
        //         left++;
        //         right--;
        //     }
        // }

        // for(int j = 0; j < n; j++)
        // {
        //     int up = 0, down = m - 1;
        //     while(up < down)
        //     {
        //         if(grid[up][j] != grid[down][j])
        //             ret2++;
        //         up++;
        //         down--;
        //     }
        // }

        return min(ret1, ret2);
    }
};